package com.zw.a.basic.a15.demo04_reflect_exercise;

import java.lang.reflect.Method;
import java.util.ArrayList;

//案例: 通过反射技术，向一个泛型为Integer的集合中添加一些字符串数据
//核心细节: 泛型只在编译期有效, 在运行时无效.
public class Demo01 {
    public static void main(String[] args) throws Exception {
        //1. 定义ArrayList集合, 泛型是Integer.
        ArrayList<Integer> list = new ArrayList<>();
        //2. 尝试直接往里边添加一些数据.
        list.add(10);
        list.add(20);
        list.add(30);
        // list.add("hello");      //这行代码会报错, 因为泛型规定必须是 Integer类型的数据.

        //3. 获取ArrayList集合的字节码文件对象.
        Class<? extends ArrayList> clazz = list.getClass();
        //4. 获取add()方法对象, 并指定其形参类型为: Object.class
        Method method = clazz.getMethod("add", Object.class);
        //Method method = clazz.getMethod("add", String.class);     //这样写会报错, 因为ArrayList#add()底层就是一个Object类型的方法.
        //5. 执行第4步获取到的方法对象,往集合中添加数据.
        method.invoke(list, "hello");
        method.invoke(list, 10.3);
        method.invoke(list, false);
        //6. 打印集合.
        System.out.println(list);
    }
}
